<?php
/**
 * 初始化GatewayWorker
 * Created by PhpStorm.
 * User: zd
 * Date: 2018/11/24
 * Time: 11:09
 */

namespace app\server\controller;

use Workerman\Lib\Timer;
use Workerman\Worker;
use GatewayWorker\Gateway;
use GatewayWorker\Register;
use GatewayWorker\BusinessWorker;

class Gate
{
    /**
     * 构造函数
     * @access public
     */
    public function __construct()
    {
        //初始化register register 服务必须是text协议 。用于注册Gateway进程和BusinessWorker进程的通讯地址
       $register =  new Register('text://0.0.0.0:21000');

        //初始化 bussinessWorker 进程
        $worker = new BusinessWorker();
        $worker->name = 'ChatBusinessWorker'; // worker名称
        $worker->count = 4; // bussinessWorker进程数量
        $worker->registerAddress = '127.0.0.1:21000'; // 服务注册地址
        $worker->eventHandler = 'app\server\controller\Events'; //设置处理业务的类,此处制定Events的命名空间

        // 初始化 gateway 进程
        $gateway = new Gateway("websocket://0.0.0.0:20008");//其中的地址为NGINX反向代理后的地址
        $gateway->name = 'ChatGateway';  // 设置名称，方便status时查看
        $gateway->count = 4; // gateway 进程数量
        $gateway->lanIp = '127.0.0.1';// 分布式部署时请设置成内网ip（非127.0.0.1）
        $gateway->startPort = 25000;// // 内部通讯起始端口，假如$gateway->count=4。如起始端口为4000则一般会使用4000 4001 4002 4003 4个端口作为内部通讯端口
        $gateway->pingInterval = 30;// 心跳间隔
        $gateway->pingNotResponseLimit = 1;//心跳间隔次数，后掉线
        $gateway->pingData = ''; // 心跳数据（客户端传就为空）
        $gateway->registerAddress = '127.0.0.1:21000';// 服务注册地址

        //异步任务投递
        $task_worker = new Worker('Text://0.0.0.0:27000');
        $task_worker->count = 20;// task进程数可以根据需要多开一些cpu核数的10倍
        $task_worker->name = 'TaskWorker';
        $task_worker->reusePort = true;//只有php7才支持task->reusePort，可以让每个task进程均衡的接收任务
        $task_worker->onMessage = function($connection, $task_data)//异步任务投递
        {
            $connection->send(json_encode('ok'));  // 先返回再处理
            $task_data = json_decode($task_data, true);
            $task = new Async();
            call_user_func_array(array($task,$task_data['function']),$task_data['args']);//调用异步任务处理函数
        };
        //运行所有Worker;
        Worker::runAll();
    }
}



